// 1. 导入依赖：express用于创建路由，User模型用于操作数据库
const express = require('express');
const router = express.Router(); // 创建路由实例
const User = require('../models/User'); // 导入用户模型
const jwt = require('jsonwebtoken'); // 导入jsonwebtoken用于生成和验证JWT

// 2. 注册接口：接收POST请求（前端提交用户名和密码）
// 接口地址：http://localhost:5000/api/auth/register（后续会挂载到/api/auth路径）
router.post('/register', async (req, res) => {
  try {
    // 3. 获取前端传递的参数（通过req.body，需要express.json()中间件）
    const { username, password } = req.body;

    // 4. 验证参数合法性（后端二次验证，防止前端验证被绕过）
    if (!username || !password) {
      // 返回400错误（客户端错误）
      return res.status(400).json({
        code: 400, // 自定义状态码（前端根据code判断结果）
        message: '用户名和密码不能为空',
        data: null // 数据字段（成功时返回数据，失败时null）
      });
    }

    // 5. 检查用户名是否已存在（查询数据库）
    // User.findOne({ username }) → 查找username字段匹配的用户
    const existingUser = await User.findOne({ username });
    if (existingUser) {
      // 用户名已存在，返回错误
      return res.status(400).json({
        code: 400,
        message: '该用户名已被注册，请更换用户名',
        data: null
      });
    }

    // 6. 用户名不存在 → 创建新用户（密码会自动加密，见User模型的pre-save钩子）
    const newUser = await User.create({
      username: username, // 也可以简写为username（对象属性名和变量名相同）
      password: password
    });

    // 7. 注册成功 → 返回成功响应
    res.status(200).json({
      code: 200,
      message: '注册成功',
      data: {
        username: newUser.username, // 返回用户名（不返回密码）
        userId: newUser._id // 返回数据库自动生成的用户ID
      }
    });

  } catch (error) {
    // 8. 捕获异常（如数据库连接失败、代码错误等）
    console.error('注册接口出错：', error); // 打印错误到控制台（调试用）
    res.status(500).json({
      code: 500,
      message: '服务器错误，注册失败',
      data: null
    });
  }
});


// 新增：登录接口
router.post('/login', async (req, res) => {
  try {
    // 1. 获取前端传递的用户名和密码
    const { username, password } = req.body;

    // 2. 验证参数（后端二次验证）
    if (!username || !password) {
      return res.status(400).json({
        code: 400,
        message: '用户名和密码不能为空',
        data: null
      });
    }

    // 3. 查询用户（需要显式获取password，因为模型中设置了select: false）
    const user = await User.findOne({ username }).select('+password');
    if (!user) {
      // 用户名不存在（为了安全，不明确提示“用户名不存在”，统一提示“账号或密码错误”）
      return res.status(401).json({
        code: 401,
        message: '账号或密码错误',
        data: null
      });
    }

    // 4. 验证密码（使用User模型中定义的comparePassword方法）
    const isPasswordValid = await user.comparePassword(password);
    if (!isPasswordValid) {
      // 密码错误
      return res.status(401).json({
        code: 401,
        message: '账号或密码错误',
        data: null
      });
    }

    // 5. 生成Token（用户身份凭证）
    const token = jwt.sign(
      { id: user._id, username: user.username }, // Token中包含的用户信息（避免敏感数据）
      process.env.JWT_SECRET, // 加密密钥（从环境变量获取）
      { expiresIn: process.env.JWT_EXPIRE } // 过期时间（从环境变量获取）
    );

    // 6. 登录成功 → 返回用户信息和Token
    res.status(200).json({
      code: 200,
      message: '登录成功',
      data: {
        token: token, // 前端需要存储的Token
        userInfo: {
          id: user._id,
          username: user.username
        }
      }
    });

  } catch (error) {
    console.error('登录接口错误：', error);
    res.status(500).json({
      code: 500,
      message: '服务器错误，登录失败',
      data: null
    });
  }
});

// 9. 导出路由（供server.js使用）
module.exports = router;